import { fileURLToPath, URL } from "node:url";
import { createSvgIconsPlugin } from "vite-plugin-svg-icons";
import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue';
import AutoImport from 'unplugin-auto-import/vite';
import Icons from "unplugin-icons/vite";
import IconsResolver from "unplugin-icons/resolver";
import Components from 'unplugin-vue-components/vite';
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers';
import path from 'path';
import dts from 'vite-plugin-dts';
import federation from '@originjs/vite-plugin-federation';

export default defineConfig({
  plugins: [
    vue(),
    federation({
      name: 'hostModule',
      remotes: {
        taskModule: 'http://localhost:3001/assets/moduleEntry.js',
        createTaskModule: 'http://localhost:3002/assets/moduleEntry.js',
        testModule: 'http://localhost:3003/assets/moduleEntry.js',
        deviceModule: 'http://localhost:3004/assets/moduleEntry.js',
        calibrationModule: 'http://localhost:3005/assets/moduleEntry.js',
        userModule: 'http://localhost:3006/assets/moduleEntry.js',
        loginModule: 'http://localhost:3007/assets/moduleEntry.js',
        helpModule: 'http://localhost:3008/assets/moduleEntry.js',
      },
      filename: 'hostEntry.js',
      exposes: {
        './hostCom': './src/components/index.ts'
      },
      shared: {
        vue: {
          import: true,
          shareScope: 'default',
          version: '^3.4.21'
        },
        pinia: {
          import: true,
          shareScope: 'default',
          version: '^2.1.7'
        },
        'element-plus': {
          import: true,
          shareScope: 'default',
          version: '^2.8.8'
        },
        '@element-plus/icons-vue': {
          import: true,
          shareScope: 'default'
        }
      }
    }),
    dts({
      include: ['src/components/**/*.ts', 'src/components/**/*.d.ts', 'src/components/**/*.vue'], // 必须包含源码文件
      outDir: 'dist', // 输出目录（默认即 dist）
      staticImport: true, // 推荐启用
      insertTypesEntry: true, // 自动生成类型入口
      // 清理输出目录，避免旧文件残留
      cleanVueFileName: true,
      copyDtsFiles: true
    }),
    createSvgIconsPlugin({
      // 指定需要缓存的图标文件夹
      iconDirs: [path.resolve(process.cwd(), "src/assets/svg")],
      // 指定symbolId格式
      symbolId: "i-[dir]-[name]"
    }),
    AutoImport({
      resolvers:
        [
          IconsResolver({
            prefix: "Icon"
          }),
          ElementPlusResolver()],
    }),
    Components({
      resolvers: [
        IconsResolver({
          enabledCollections: ["ep"]
        }),
        ElementPlusResolver()
      ],
    }),
    Icons({
      autoInstall: true,
      compiler: "vue3"
    })
  ],
  resolve: {
    alias: {
      "@": fileURLToPath(new URL("./src", import.meta.url)),
    },
  },
  server: {
    port: 3000,
    fs: {
      // 允许从文件系统任意位置导入模块
      allow: ['D:\\modules', 'C:\\', '/']
    }
  },
  optimizeDeps: {
    // 明确预构建平台核心依赖（Vue、Pinia 等），插件加载时直接复用预构建结果
    include: [
      // Vue 生态
      'vue',
      'vue-router',
      'vue-i18n',
      'vue-demi',
      'vue-virtual-scroller',
      'vuedraggable',
      // 状态管理
      'pinia',
      // UI 组件库
      'element-plus',
      '@element-plus/icons-vue',
      // 工具库
      'lodash',
      'moment',
      'js-cookie', // 建议补充安装后加入
      'axios',
      'better-mock',
      'echarts',
      'split.js',
      'uuid',
      '@microsoft/signalr',
      // 自定义组件库（平台核心提供能力）
      '@xc-components/xc-form',
      '@xc-components/xc-table',
      // 图标相关（Element Plus 图标）
      '@iconify-json/ep',
      // '@/modules/mctp-modules-task/mctp-modules-task.js',
    ],
    force: true,
  },
  build: {
    // outDir: path.resolve(__dirname, '../mctp-modules/mctp-modules-template/src/dist'),
    emptyOutDir: true,
    outDir: path.resolve(__dirname, './dist'),
    target: ['es2022', 'edge89', 'firefox89', 'chrome89', 'safari15'],
    rollupOptions: {
      external: [],               // 空数组表示不外部化任何依赖（全部打包）
      output: {
        // 如果依赖需要全局变量（可选）
        globals: {},
        manualChunks: undefined,
        exports: 'named',
        // 确保模块导出规范
        interop: 'auto',
        // 保留模块结构z
        preserveModules: false,
      }
    },
    // 优化构建输出
    minify: true,
    sourcemap: false,
    // 复制静态资源（包括插件模块）
    copyPublicDir: true,
  },
});